/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "物理/物理.h"

#include "../节点.h"
#include <物体/物体.h>
#include <面/面.h>





class C_物理碰撞节点 : public C_节点基类 {

public:
	C_物理碰撞节点(S_设备环境& ctx);

	E_物理碰撞几何类型	m_物理体类型;

	bool				f_update();

};

C_节点基类* f_node_加载物理碰撞节点(S_设备环境& ctx, FILE* f);





class C_物理几何体节点 : public C_节点基类 {

public:
	C_物理几何体节点(S_设备环境& ctx);
	~C_物理几何体节点();

	S_Props	m_物理引擎类型;
	S_Props	m_几何体类型;

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_加载物理几何体节点(S_设备环境& ctx, FILE* f);
void		f_node_保存物理几何体节点(C_节点基类* n, FILE* f);










class C_物理体节点 : public C_节点基类 {
	S_物体*		m_数据可视物体;
	uint8		m_是否完成计算;
public:
	C_物理体节点(S_设备环境& ctx);
	~C_物理体节点();
	
	S_Props		m_物理引擎类型;
	S_Props		m_物理体类型;
	S_Props		m_粒子最大数;
	S_Props		m_填充方式;
	S_Props		m_是否多线程;

	bool		f_update();
	void		f_异步解算();

	void		f_读取(FILE* f);
	void		f_写入(FILE* f);

	S_物体*		f_get虚拟体();

};

C_节点基类* f_node_加载物理体节点(S_设备环境& ctx, FILE* f);
void		f_node_保存物理体节点(C_节点基类* n, FILE* f);









class C_物理体添加节点 : public C_节点基类 {
	
public:
	C_物理体添加节点(S_设备环境& ctx);

	bool		f_update();
	//void		f_读取(FILE* f);
	//void		f_写入(FILE* f);
	C_插座基类*	f_动态添加插座(E_插座方向 方向);
};

C_节点基类* f_node_加载物理体添加节点(S_设备环境& ctx, FILE* f);
void		f_node_保存物理体添加节点(C_节点基类* n, FILE* f);



class C_取物理体节点 : public C_节点基类 {

public:
	C_取物理体节点(S_设备环境& ctx);
	~C_取物理体节点();

	S_Props	m_物理几何类型;
	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_加载取物理体节点(S_设备环境& ctx, FILE* f);
void		f_node_保存取物理体节点(C_节点基类* n, FILE* f);



class C_物理体绑定物体节点 : public C_节点基类 {

public:
	C_物理体绑定物体节点(S_设备环境& ctx);
	~C_物理体绑定物体节点();

	//S_Props		m_物理几何类型;
	E_物理碰撞几何类型 几何类型;

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_加载物理体绑定物体节点(S_设备环境& ctx, FILE* f);
void		f_node_保存物理体绑定物体节点(C_节点基类* n, FILE* f);




class C_物理引擎内部几何节点 : public C_节点基类 {
public:
	C_物理引擎内部几何节点(S_设备环境& ctx);
	~C_物理引擎内部几何节点();

	bool	f_update();

	void	f_读取(FILE* f);
	void	f_写入(FILE* f);
};

C_节点基类* f_node_加载物理引擎内部几何节点(S_设备环境& ctx, FILE* f);
void		f_node_保存物理引擎内部几何节点(C_节点基类* n, FILE* f);




class C_发射节点 : public C_节点基类 {

public:
	C_发射节点(S_设备环境& ctx);

	S_Props			m_发射方式;
	bool			f_update();
	//void			f_读取(FILE* f);
	//void			f_写入(FILE* f);
};

C_节点基类* f_node_加载发射节点(S_设备环境& ctx, FILE* f);
void		f_node_保存发射节点(C_节点基类* n, FILE* f);







class C_物理变换回写节点 : public C_节点基类 {
	
public:
	C_物理变换回写节点(S_设备环境& ctx);

	bool			f_update();
	//void			f_读取(FILE* f);
	//void			f_写入(FILE* f);
};

C_节点基类* f_node_加载物理变换回写节点(S_设备环境& ctx, FILE* f);















